# -*- coding:utf-8 -*-
"""
参考博客：http://my.oschina.net/u/2318847/blog/422542

SVD数学表示：a == U*S*Vh

函数原型及参数说明
scipy.linalg.svd(a, full_matrices=True, compute_uv=True, overwrite_a=False, check_finite=True)
  -a，输入矩阵
  -full_matrices，如果为True，U为(M,M)矩阵，Vh为(N,N)矩阵。如果为False，U为(M,K)矩阵，Vh为(K,N)矩阵，K=min(M, N)
  -compute_uv，是否计算U和Vh
  -overwrite_a，是否覆盖输入矩阵a
  -check_finite，检查输入矩阵是否含有无穷值
"""

import numpy as np
import scipy.linalg

# 随机生成50个数据，每个数据包含4个特征值
data = np.random.random((50,4))
print data, np.shape(data)
# 奇异值分解
U, S, V = scipy.linalg.svd(data)
# 左酋矩阵
# print U, np.shape(U)
# 奇异值
# print S, np.shape(S)
# 右酋矩阵
# print V, np.shape(V)

# 保留奇异值最大的k个
# 近似对角阵
S_k = np.zeros(np.shape(data))
k = 2
for i in range(len(S)):
  if i < k:
    S_k[i,i] = S[i]
  else:
    break

# 低阶近似矩阵
newData = np.dot(np.dot(U,S_k),V)
print newData, np.shape(newData)
